#define _CRT_SECURE_NO_WARNINGS 1

//#include <iostream>
//#include <vector>
//using namespace std;
//
//const int N = 110, mod = 1e9 + 7;
//int a[N];
//int n;
//
//int main()
//{
//    cin >> n;
//    int tot = 0;
//    for (int i = 1; i <= n; i++)
//    {
//        cin >> a[i];
//        tot += a[i];
//    }
//
//    vector<vector<int>> f(n + 1, vector<int>(tot + 1));
//    f[0][0] = 1;
//
//    for (int i = 1; i <= n; i++)
//        for (int j = 1; j <= tot - n + i; j++)
//            for (int k = 1; k <= j; k++)
//            {
//                if (k == a[i])   continue;
//                f[i][j] = (f[i][j] + f[i - 1][j - k]) % mod;
//            }
//
//    cout << f[n][tot] << endl;
//    return 0;
//}

#include <iostream>
#include <map>
#include <set>
#include <unordered_map>
#include <vector>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int idx = 0;
    map<string, int> ids;
    unordered_map<int, string>   main;
    unordered_map<int, set<string>>   stores;

    auto check = [&](const string& name, const string& addr)->bool {
        for (auto it : name)
            if (it > 'z' || it < 'a')
                return false;
        for (auto it : addr)
            if (it > 'z' || it < 'a')
                return false;

        if (ids.count(name))
        {
            int t = ids[name];
            if (main[t] == addr) return false;
            if (stores[t].count(addr))   return false;
        }

        return true;
    };

    while (n--)
    {
        string name, add;
        cin >> name >> add;

        if (ids.count(name) && check(name, add))
        {
            int id = ids[name];
            stores[id].insert(add);
        }
        else if (ids.count(name) == 0 && check(name, add))
        {
            int t = idx++;
            ids[name] = t;
            main[t] = add;
        }
    }

    for (auto it : ids)
    {
        auto t = it.second;
        cout << it.first << " " << main[t] << " " << stores[t].size() << endl;
    }
    return 0;
}
